#include <jni.h>

#include "cv.h"
#include "highgui.h"
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <math.h>
#include <float.h>
#include <limits.h>
#include <ctype.h>
#include <android/log.h>
 int ImageAdjust(IplImage *src,IplImage *dst,  
                 double low,double high,        //x direction  
                 double bottom,double top,    //y direction  
                 double gamma);  

// int main(void)  
 
JNIEXPORT jint JNICALL Java_com_opencvtest_opencvtest_getKeypointNum(JNIEnv* env,jobject thiz)
//JNIEXPORT void JNICALL Java_HelloWorld_print(JNIEnv* env,jobject thiz)
 {  
     //char *filename="../Histogram/Equalize DarkClouds.jpg";
   //  char *filename="/mnt/sdcard/lena.jpg";
    // IplImage *dst,*src = cvLoadImage(filename,0);
    IplImage* *dst,*src = cvLoadImage( "/mnt/sdcard/lena.jpg", CV_LOAD_IMAGE_GRAYSCALE );
     if(!src)  
     {  
         //printf("Couldn't seem to Open %s, sorry\n",filename);  
         return -1;  
     }  
      
  // cvNamedWindow( "src", 1 );  
  //   cvNamedWindow( "result", 1 );  

      
     // Image adjust  
      dst = cvCloneImage(src);
     // 输入参数 [0,0.5] 和 [0.5,1], gamma=1  
    // if( ImageAdjust( src, dst, 0, 0.5, 0.5, 1, 1)!=0)
        if( ImageAdjust( src, dst, 0, 1, 1, 0, 1)!=0)
         return -1;  

    
    // cvShowImage( "src", src );  
    // cvShowImage( "result", dst );  
     cvSaveImage("/mnt/sdcard/conre.jpg",dst,0);
     cvSaveImage("/mnt/sdcard/consrc.jpg",src,0);
    // cvWaitKey(0);  
    // cvDestroyWindow("src");  
    // cvDestroyWindow("result");  
     cvReleaseImage( &src );  
     cvReleaseImage( &dst );  
      
     return 0;  
 }  

int ImageAdjust(IplImage* src, IplImage* dst,  
         double low, double high,   // X方向：low and high are the intensities of src  
         double bottom, double top, // Y方向：mapped to bottom and top of dst  
         double gamma )  
 {  
     double low2 = low*255;  
     double high2 = high*255;  
     double bottom2 = bottom*255;  
     double top2 = top*255;  
     double err_in = high2 - low2;  
     double err_out = top2 - bottom2;  
     int x,y;  
     double val;  
     if(low<0 && low>1 && high <0 && high>1&&  
     bottom<0 && bottom>1 && top<0 && top>1 && low>high)  
         return -1;  
       // intensity transform  
//		 LOGI("ImageAdjust success+++++++++++");
     for( y = 0; y < src->height; y++)  
     {  
         for (x = 0; x < src->width; x++)  
         {  
             val = ((uchar*)(src->imageData + src->widthStep*y))[x];  
             val=pow((val - low2)/err_in, gamma)*err_out+bottom2;  
             if(val>255)  
                 val=255;  
             if(val<0)  
                 val=0; // Make sure src is in the range [low,high]  
             ((uchar*)(dst->imageData + dst->widthStep*y))[x] = (uchar) val;  
         }  
     }  
     return 0;  
 }
  

